精通SpringBoot 您所在的位置:网站首页 sched_error 08 精通SpringBoot

精通SpringBoot

2023-11-23 17:56| 来源: 网络整理| 查看: 265

定时任务简述

定时任务,在企业开发中尤其重要,很多业务都是需要定时任务去做的。比如说10点开售某件东西,凌晨0点统计注册人数,统计其他各种等等。这个时候不可能说让人为的去开启某个开关或者怎么怎么样的,如果这样的话,估计都要崩溃了。今天给大家介绍如何在项目中使用Quartz并且在后台动态配置定时任务的启动,暂停,重启,停止,还有修改启动的时间,修改执行的任务等。

引入依赖的jar包 org.springframework.boot spring-boot-starter-quartz org.springframework.boot spring-boot-starter-web org.mybatis.spring.boot mybatis-spring-boot-starter 1.3.2 mysql mysql-connector-java runtime application.yml的配置 quartz: scheduler: instance-name: MyselfScheduler instance-id: NON_CLUSTERED # 使用集群:AUTO 不使用集群:NON_CLUSTERED skip-update-check: true job-factory: class: org.quartz.simpl.SimpleJobFactory job-store: class: org.quartz.impl.jdbcjobstore.JobStoreTX driver-delegate-class: org.quartz.impl.jdbcjobstore.StdJDBCDelegate datasource: quartzDataSource table-prefix: QRTZ_ is-clustered: true thread-pool: class: org.quartz.simpl.SimpleThreadPool thread-count: 5 datasource: quartzDataSource: driver: ${spring.datasource.druid.driver-class-name} url: ${spring.datasource.druid.url} user: ${spring.datasource.druid.username} password: ${spring.datasource.druid.password} maxConnections: 5 validationQuery: select 0 connection-provider: class: com.lingdu.welend.config.quartz.DruidConnectionProvider 扩展druid数据源作为quartz的数据源 import com.alibaba.druid.pool.DruidDataSource; import org.quartz.SchedulerException; import org.quartz.utils.ConnectionProvider; import java.sql.Connection; import java.sql.SQLException; /** * @author Lee * @// TODO 2018/6/1-16:37 * @description Druid连接池的Quartz扩展类 */ public class DruidConnectionProvider implements ConnectionProvider { /* * 常量配置,与quartz.properties文件的key保持一致(去掉前缀),同时提供set方法,Quartz框架自动注入值。 */ //JDBC驱动 public String driver; //JDBC连接串 public String URL; //数据库用户名 public String user; //数据库用户密码 public String password; //数据库最大连接数 public int maxConnections; //数据库SQL查询每次连接返回执行到连接池,以确保它仍然是有效的。 public String validationQuery; private boolean validateOnCheckout; private int idleConnectionValidationSeconds; public String maxCachedStatementsPerConnection; private String discardIdleConnectionsSeconds; public static final int DEFAULT_DB_MAX_CONNECTIONS = 10; public static final int DEFAULT_DB_MAX_CACHED_STATEMENTS_PER_CONNECTION = 120; //Druid连接池 private DruidDataSource datasource; /* * 接口实现 */ public Connection getConnection() throws SQLException { return datasource.getConnection(); } public void shutdown() throws SQLException { datasource.close(); } public void initialize() throws SQLException { if (this.URL == null) { throw new SQLException("DBPool could not be created: DB URL cannot be null"); } if (this.driver == null) { throw new SQLException("DBPool driver could not be created: DB driver class name cannot be null!"); } if (this.maxConnections < 0) { throw new SQLException("DBPool maxConnectins could not be created: Max connections must be greater than zero!"); } datasource = new DruidDataSource(); try { datasource.setDriverClassName(this.driver); } catch (Exception e) { try { throw new SchedulerException("Problem setting driver class name on datasource: " + e.getMessage(), e); } catch (SchedulerException e1) { } } datasource.setUrl(this.URL); datasource.setUsername(this.user); datasource.setPassword(this.password); datasource.setMaxActive(this.maxConnections); datasource.setMinIdle(1); datasource.setMaxWait(0); datasource.setMaxPoolPreparedStatementPerConnectionSize(DEFAULT_DB_MAX_CONNECTIONS); if (this.validationQuery != null) { datasource.setValidationQuery(this.validationQuery); if (!this.validateOnCheckout) datasource.setTestOnReturn(true); else datasource.setTestOnBorrow(true); datasource.setValidationQueryTimeout(this.idleConnectionValidationSeconds); } } /* * 提供get set方法 */ public String getDriver() { return driver; } public void setDriver(String driver) { this.driver = driver; } public String getURL() { return URL; } public void setURL(String URL) { this.URL = URL; } public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getMaxConnections() { return maxConnections; } public void setMaxConnections(int maxConnections) { this.maxConnections = maxConnections; } public String getValidationQuery() { return validationQuery; } public void setValidationQuery(String validationQuery) { this.validationQuery = validationQuery; } public boolean isValidateOnCheckout() { return validateOnCheckout; } public void setValidateOnCheckout(boolean validateOnCheckout) { this.validateOnCheckout = validateOnCheckout; } public int getIdleConnectionValidationSeconds() { return idleConnectionValidationSeconds; } public void setIdleConnectionValidationSeconds(int idleConnectionValidationSeconds) { this.idleConnectionValidationSeconds = idleConnectionValidationSeconds; } public DruidDataSource getDatasource() { return datasource; } public void setDatasource(DruidDataSource datasource) { this.datasource = datasource; } public String getDiscardIdleConnectionsSeconds() { return discardIdleConnectionsSeconds; } public void setDiscardIdleConnectionsSeconds(String discardIdleConnectionsSeconds) { this.discardIdleConnectionsSeconds = discardIdleConnectionsSeconds; } } Quartz的配置文件

AppConfig用于获取自定义配置(下篇将会介绍自定义配置的实现方式)

package com.lingdu.welend.config.quartz; import com.lingdu.welend.config.web.AppConfig; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.impl.StdSchedulerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.io.IOException; import java.util.Properties; /** * @author Lee * @// TODO 2018/6/1-13:43 * @description */ @Configuration public class QuartzConfiguration { @Autowired private AppConfig appConfig; @Bean public Scheduler scheduler() throws IOException, SchedulerException { SchedulerFactory schedulerFactory = new StdSchedulerFactory(quartzProperties()); Scheduler scheduler = schedulerFactory.getScheduler(); scheduler.start(); return scheduler; } @Bean public Properties quartzProperties() throws IOException { Properties prop = new Properties(); prop.put("quartz.scheduler.instanceName", appConfig.getQuartzSchedulerInstanceName()); prop.put("org.quartz.scheduler.instanceId", appConfig.getQuartzSchedulerInstanceId()); prop.put("org.quartz.scheduler.skipUpdateCheck", appConfig.getQuartzSchedulerSkipUpdateCheck()); prop.put("org.quartz.scheduler.jobFactory.class", appConfig.getQuartzSchedulerJobFactoryClass()); prop.put("org.quartz.jobStore.class", appConfig.getQuartzJobStoreClass()); prop.put("org.quartz.jobStore.driverDelegateClass", appConfig.getQuartzJobStoreDriverDelegateClass()); prop.put("org.quartz.jobStore.dataSource", appConfig.getQuartzJobStoreDatasource()); prop.put("org.quartz.jobStore.tablePrefix", appConfig.getQuartzJobStoreTablePrefix()); prop.put("org.quartz.jobStore.isClustered", appConfig.getQuartzJobStoreIsClustered()); prop.put("org.quartz.threadPool.class", appConfig.getQuartzThreadPoolClass()); prop.put("org.quartz.threadPool.threadCount", appConfig.getQuartzThreadPoolThreadCount()); prop.put("org.quartz.dataSource.quartzDataSource.connectionProvider.class", appConfig.getQuartzDatasourceQuartzDataSourceConnectionProviderClass()); prop.put("org.quartz.dataSource.quartzDataSource.driver", appConfig.getQuartzDatasourceQuartzDataSourceDriver()); prop.put("org.quartz.dataSource.quartzDataSource.URL", appConfig.getQuartzDatasourceQuartzDataSourceUrl()); prop.put("org.quartz.dataSource.quartzDataSource.user", appConfig.getQuartzDatasourceQuartzDataSourceUser()); prop.put("org.quartz.dataSource.quartzDataSource.password", appConfig.getQuartzDatasourceQuartzDataSourcePassword()); prop.put("org.quartz.dataSource.quartzDataSource.maxConnections", appConfig.getQuartzDatasourceQuartzDataSourceMaxConnections()); return prop; } } CURD——配置定时任务

接下来我们要实现怎么将定时任务配置在数据库中。首先 看实体类

/** * @author Lee * @// TODO 2018/6/1-13:27 * @description */ public class TaskEntity implements Serializable { private final Long serialVersion = -12654128415L; private Long id; //ID private String jobName; //任务名称 private String jobGroup; //任务分组 private String jobStatus; //任务状态 private String jobClass;//任务执行方法 private String cronExpression; // cron 表达式 private String jobDescription; //任务描述 private String timeZoneId; // 时区 private Long startTime; private Long endTime; private String state; //状态 public Long getId() { return id; } public void setId(Long id) { this.id= id; } public String getJobName() { return jobName; } public void setJobName(String jobName) { this.jobName = jobName; } public String getJobGroup() { return jobGroup; } public void setJobGroup(String jobGroup) { this.jobGroup = jobGroup; } public String getJobStatus() { return jobStatus; } public void setJobStatus(String jobStatus) { this.jobStatus = jobStatus; } public String getJobClass() { return jobClass; } public void setJobClass(String jobClass) { this.jobClass = jobClass; } public String getCronExpression() { return cronExpression; } public void setCronExpression(String cronExpression) { this.cronExpression = cronExpression; } public String getJobDescription() { return jobDescription; } public void setJobDescription(String jobDescription) { this.jobDescription = jobDescription; } public String getTimeZoneId() { return timeZoneId; } public void setTimeZoneId(String timeZoneId) { this.timeZoneId = timeZoneId; } public Long getStartTime() { return startTime; } public void setStartTime(Long startTime) { this.startTime = startTime; } public Long getEndTime() { return endTime; } public void setEndTime(Long endTime) { this.endTime = endTime; } public String getState() { return state; } public void setState(String state) { this.state = state; } } Service

贴下主要逻辑的处理,Controller 就不写了

import com.lingdu.welend.exception.WelendException; import com.lingdu.welend.models.basic.task.dao.TaskDao; import com.lingdu.welend.models.basic.task.entity.TaskEntity; import com.lingdu.welend.models.basic.task.service.ITaskService; import com.lingdu.welend.models.common.entity.StatusCode; import org.apache.commons.lang3.time.DateFormatUtils; import org.quartz.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.HashSet; import java.util.List; /** * @author Lee * @// TODO 2018/6/1-13:26 * @description */ @Service public class TaskServiceImpl implements ITaskService { @Autowired private TaskDao taskDao; @Autowired private Scheduler scheduler; /** * @param info * @return * @// TODO: 2018/6/8 保存定时任务 */ @SuppressWarnings("unchecked") public Boolean addTask(TaskEntity info) { String jobName = info.getJobName(), jobGroup = info.getJobGroup(), cronExpression = info.getCronExpression(), jobDescription = info.getJobDescription(); try { if (checkExists(jobName, jobGroup)) { throw new WelendException(String.format("Job已经存在, jobName:{%s},jobGroup:{%s}", jobName, jobGroup)); } TriggerKey triggerKey = TriggerKey.triggerKey(jobName, jobGroup); JobKey jobKey = JobKey.jobKey(jobName, jobGroup); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing(); CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withDescription(jobDescription).withSchedule(scheduleBuilder).build(); Class


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有